#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProcess>
#include <QTextEdit>
#include <QStackedWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QGroupBox>
#include <QInputDialog>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QDialog>
#include <QFormLayout>
#include <QDialogButtonBox>
#include <QLabel>

class MainWindow : public QMainWindow {
    Q_OBJECT  // Qt 宏，启用信号槽机制

public:
    MainWindow(QWidget *parent = nullptr);  // 构造函数
    ~MainWindow();  // 析构函数

private slots:  // 槽函数声明
    void onRegisterClicked();  // 注册按钮点击事件
    void onLoginClicked();     // 登录按钮点击事件
    void onExitClicked();      // 退出按钮点击事件
    void onCommandEntered();   // 命令输入事件
    void onReadyReadStandardOutput();  // 处理标准输出
    void onReadyReadStandardError();   // 处理标准错误输出
    void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);  // 进程结束事件
    
    // 新增按钮槽函数
    void onSaveClicked();
    void onLogoutClicked();
    void onAddTaskClicked();
    void onDelTaskClicked();
    void onHelpClicked();
    void onShowTasksClicked();

private:
    // 界面组件
    QStackedWidget *stackedWidget;  // 堆栈窗口，用于切换不同页面
    QWidget *loginPage;             // 登录页面
    QWidget *mainPage;              // 主页面
    QPushButton *btnRegister;       // 注册按钮
    QPushButton *btnLogin;          // 登录按钮
    QPushButton *btnExit;           // 退出按钮
    QTextEdit *mainOutput;          // 主输出区域
    QTextEdit *backcheckOutput;     // 后台线程输出区域
    QLineEdit *txtCommand;          // 命令输入框
    QPushButton *btnSend;           // 发送按钮
    QGroupBox *backcheckGroup;      // 后台线程输出分组框
    
    // 新增功能按钮
    QPushButton *btnAddTask;
    QPushButton *btnDelTask;
    QPushButton *btnHelp;
    QPushButton *btnShowTasks;
    QPushButton *btnSave;
    QPushButton *btnLogout;
    QLineEdit *txtUsername;  // 用户名输入框
    QLineEdit *txtPassword;  // 密码输入框
    QProcess *backendProcess;  // 后端进程对象
    bool isLoggedIn;           // 登录状态标志
    QString username;          // 当前登录用户名

    // 私有方法
    void setupLoginUI();       // 设置登录界面
    void setupMainUI();        // 设置主界面
    void sendCommand(const QString &cmd);  // 向后端发送命令
};

#endif // MAINWINDOW_H
